/**
 * Ajax Queue Plugin
 *
 * Homepage: http://jquery.com/plugins/project/ajaxqueue
 * Documentation: http://docs.jquery.com/AjaxQueue
 */

/**

 <script>
 $(function(){
	jQuery.ajaxQueue({
		url: "test.php",
		success: function(html){ jQuery("ul").append(html); }
	});
	jQuery.ajaxQueue({
		url: "test.php",
		success: function(html){ jQuery("ul").append(html); }
	});
	jQuery.ajaxSync({
		url: "test.php",
		success: function(html){ jQuery("ul").append("<b>"+html+"</b>"); }
	});
	jQuery.ajaxSync({
		url: "test.php",
		success: function(html){ jQuery("ul").append("<b>"+html+"</b>"); }
	});
});
 </script>
 <ul style="position: absolute; top: 5px; right: 5px;"></ul>

 */
/*
 * Queued Ajax requests.
 * A new Ajax request won't be started until the previous queued 
 * request has finished.
 */

/*
 * Synced Ajax requests.
 * The Ajax request will happen as soon as you call this method, but
 * the callbacks (success/error/complete) won't fire until all previous
 * synced requests have been completed.
 */


(function ($) {

  var ajax = $.ajax;

  var pendingRequests = {};

  var synced = [];
  var syncedData = [];

  $.ajax = function (settings) {
    // create settings for compatibility with ajaxSetup
    settings = jQuery.extend(settings, jQuery.extend({}, jQuery.ajaxSettings, settings));

    var port = settings.port;

    switch (settings.mode) {
      case "abort":
        if (pendingRequests[port]) {
          pendingRequests[port].abort();
        }
        return pendingRequests[port] = ajax.apply(this, arguments);
      case "queue":
        var _old = settings.complete;
        settings.complete = function () {
          if (_old)
            _old.apply(this, arguments);
          jQuery([ajax]).dequeue("ajax" + port);
          ;
        };

        jQuery([ajax]).queue("ajax" + port, function () {
          ajax(settings);
        });
        return;
      case "sync":
        var pos = synced.length;

        synced[pos] = {
          error: settings.error,
          success: settings.success,
          complete: settings.complete,
          done: false
        };

        syncedData[pos] = {
          error: [],
          success: [],
          complete: []
        };

        settings.error = function () {
          syncedData[pos].error = arguments;
        };
        settings.success = function () {
          syncedData[pos].success = arguments;
        };
        settings.complete = function () {
          syncedData[pos].complete = arguments;
          synced[pos].done = true;

          if (pos == 0 || !synced[pos - 1])
            for (var i = pos; i < synced.length && synced[i].done; i++) {
              if (synced[i].error) synced[i].error.apply(jQuery, syncedData[i].error);
              if (synced[i].success) synced[i].success.apply(jQuery, syncedData[i].success);
              if (synced[i].complete) synced[i].complete.apply(jQuery, syncedData[i].complete);

              synced[i] = null;
              syncedData[i] = null;
            }
        };
    }
    return ajax.apply(this, arguments);
  };

})(jQuery);